/*
 * Copyright (c) 2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.wso2.carbon.registry.social.api.people.userprofile.model;

import com.google.common.base.Objects;
import com.google.common.collect.ImmutableMap;

import java.util.Map;

public class GroupId {
    public enum Type {
        all, friends, self, deleted, groupId;

        /**
         * A map of JSON strings to Type objects
         */
        private static final Map<String, Type> jsonTypeMap;

        static {
            ImmutableMap.Builder<String, Type> builder = ImmutableMap.builder();
            for (Type type : Type.values()) {
                builder.put('@' + type.name(), type);
            }
            jsonTypeMap = builder.build();
        }

        /**
         * Return the Type enum value given a specific jsonType such as @all, @friends, etc.
         *
         * @param jsonType the type string to convert
         * @return A Type Enum value or null if no value exists
         */
        public static Type jsonValueOf(String jsonType) {
            return jsonTypeMap.get(jsonType);
        }
    }

    private Type type;
    private String groupId;

    public GroupId(Type type, String groupId) {
        this.groupId = groupId;
        this.type = type;
    }

    public Type getType() {
        return type;
    }

    public String getGroupId() {
        // Only valid for objects with type=groupId
        return groupId;
    }

    public static GroupId fromJson(String jsonId) {
        Type idSpecEnum = Type.jsonValueOf(jsonId);
        if (idSpecEnum != null) {
            return new GroupId(idSpecEnum, null);
        }

        return new GroupId(Type.groupId, jsonId);
    }

    // These are overriden so that EasyMock doesn't throw a fit

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof GroupId)) {
            return false;
        }

        GroupId actual = (GroupId) o;
        return this.type == actual.type && Objects.equal(this.groupId, actual.groupId);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(this.groupId, this.type);
    }

    @Override
    public String toString() {
        switch (type) {
            case all:
                return "ALL";
            case deleted:
                return "DELETE";
            case friends:
                return "FRIENDS";
            case self:
                return "SELF";
            case groupId:
                return "GROUPID(" + groupId + ')';
            default:
                return "UNKNOWN";
        }
    }
}
